package product

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"woo-server/coms/structs"
	"woo-server/coms/utils"
	"woo-server/models/api"
	"woo-server/models/db/product"
)

// 结构
type CategoryService struct {
	*structs.Common
}

// 初始化
func NewProductCategoryService(com *structs.Common) *CategoryService {
	return &CategoryService{com}
}

// 商品分类列表
func (m *CategoryService) GetProductCategoryList(context *gin.Context, isTree bool) *api.ResultEntity {
	// 获取Redis缓存商品分类
	//treeList, _ := utils.RedisClient.Get("ProductCategoryTreeList").Result()
	//list, _ := utils.RedisClient.Get("List").Result()
	fmt.Println("------实时获取商品分类分割线-----")
	// 没缓存则实时取
	//if list == "" && treeList == "" {
	search := context.Query("search")
	page := structs.SetInt(context.Query("page"))
	pageSize := structs.SetInt(context.Query("pageSize"))
	ProductCategoryModel := product.NewProductCategory(m.Common)
	treeList, total := ProductCategoryModel.GetListAndTotal(search, page, pageSize)
	//utils.RedisClient.Set("ProductCategoryTreeList", utils.ToJson(treeList), 0)
	//utils.RedisClient.Set("List", utils.ToJson(list), 0)

	//if isTree {
	result := map[string]interface{}{"list": treeList, "total": total}
	return api.SuccessToJson(result, "商品分类列表获取成功!")
	//} else {
	//	result := map[string]interface{}{"list": list, "total": total}
	//	return api.SuccessToJson(result, "商品分类列表获取成功!")
	//}

	//}
	//fmt.Println("------缓存权限商品分类分割线-----")
	//
	//if isTree {
	//	// 获取缓存商品分类
	//	var AdminProductCategorys []product.ProductCategory
	//	json.Unmarshal([]byte(treeList), &AdminProductCategorys)
	//	return api.SuccessToJson(AdminProductCategorys, "商品分类列表获取成功!")
	//} else {
	//	// 获取缓存商品分类
	//	var AdminProductCategorys []product.ProductCategory
	//	json.Unmarshal([]byte(list), &AdminProductCategorys)
	//	return api.SuccessToJson(AdminProductCategorys, "商品分类列表获取成功!")
	//}
}

// 当前用户信息
func (m *CategoryService) GetProductCategoryConfig(context *gin.Context) *api.ResultEntity {
	ProductCategoryModel := product.NewProductCategory(m.Common)
	data := ProductCategoryModel.GetConfig()
	return api.SuccessToJson(data, "获取商品分类配置成功!")
}

func (m *CategoryService) PostSave(context *gin.Context) *api.ResultEntity {
	Name := context.PostForm("Name")
	if Name == "" {
		return api.Error("商品分类名称不能为空!")
	}
	ProductCategoryModel := product.NewProductCategory(m.Common)
	// 基础参数
	ProductCategoryModel.SetCreateInfo(m.Claim.UserId)
	ProductCategoryModel.Name = Name
	ProductCategoryModel.Sort = uint(structs.SetInt(context.PostForm("Sort")))
	ProductCategoryModel.ImageId = uint(structs.SetInt(context.PostForm("ImageId")))
	ProductCategoryModel.ParentId = uint64(structs.SetInt(context.PostForm("ParentId")))
	CategoryId := uint64(structs.SetInt(context.PostForm("CategoryId")))
	var err error
	if CategoryId == 0 {
		// 执行创建
		err = ProductCategoryModel.Create()
	} else {
		ProductCategoryModel.CategoryId = CategoryId
		err = ProductCategoryModel.Save()

	}
	if err != nil {
		// 日志
		utils.LogError("新增商品分类报错:%s", err.Error())
		return api.Error(err.Error())
	}
	// ------------------清除商品分类缓存----------------------
	utils.RedisClient.Set("ProductCategoryTreeList", "", 0)
	utils.RedisClient.Set("List", "", 0)
	return api.Success("success")
}

func (m *CategoryService) Delete(context *gin.Context) *api.ResultEntity {
	// 接收POST参数
	CategoryId := context.PostForm("CategoryId")
	// 校验参数
	if CategoryId == "" {
		return api.Error("ID不能为空!")
	}
	// 实例化数据库
	ProductCategoryModel := product.NewProductCategory(m.Common)
	// 查询是否有子商品分类
	ProductCategoryModel.GetFirst("parent_id", structs.SetInt(CategoryId))
	// 判断子商品分类
	if ProductCategoryModel.CategoryId != 0 {
		return api.Error("该商品分类下有子商品分类.请先删除对应子商品分类!")
	}
	// 执行删除
	ProductCategoryModel.CategoryId = uint64(structs.SetInt(CategoryId))
	// 删除数据
	err := ProductCategoryModel.Delete()
	if err != nil {
		utils.LogError("删除商品分类报错:%s", err.Error())
		return api.Error(err.Error())
	}
	// ------------------清除商品分类缓存----------------------
	utils.RedisClient.Set("RoleProductCategoryList_1", "", 0)
	utils.RedisClient.Set("RoleProductCategoryList_1", "", 0)
	utils.RedisClient.Set("ProductCategoryTreeList", "", 0)
	utils.RedisClient.Set("List", "", 0)
	return api.Success("删除成功")
}
